package org.becomingMd;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class ServerSendFileThread extends Thread {
    private Socket socket;

    public ServerSendFileThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try (DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
             Scanner scanner = new Scanner(System.in)) {

            System.out.println("\n=== 进入文件发送模式（输入 /help 查看指令）===");

            while (true) {
                System.out.print("CMD> "); // 明确的命令提示符
                String rawInput = scanner.nextLine().trim();

                // 退出指令处理
                if ("exit".equalsIgnoreCase(rawInput)) {
                    System.out.println("退出文件发送模式");
                    break;
                }

                // 帮助指令
                if ("/help".equalsIgnoreCase(rawInput)) {
                    printHelp();
                    continue;
                }

                // 命令格式校验
                if (!rawInput.startsWith("/send ")) {
                    System.err.println("错误：无效命令格式，正确格式：/send \"文件路径\"");
                    continue;
                }

                // 提取文件路径（支持带空格路径）
                String filePath = rawInput.substring(6).trim();
                if (filePath.startsWith("\"") && filePath.endsWith("\"")) {
                    filePath = filePath.substring(1, filePath.length() - 1);
                }

                // 文件存在性校验
                File file = new File(filePath);
                if (!file.exists() || !file.isFile()) {
                    System.err.println("错误：文件不存在或不是有效文件");
                    continue;
                }

                // 发送文件元数据
                sendMetadata(dos, file);

                // 发送文件内容
                try (FileInputStream fis = new FileInputStream(file)) {
                    byte[] buffer = new byte[4096];
                    int bytesRead;
                    while ((bytesRead = fis.read(buffer)) != -1) {
                        dos.write(buffer, 0, bytesRead);
                    }
                    dos.flush();
                    System.out.println("文件发送完成：" + file.getName());
                } catch (IOException e) {
                    System.err.println("文件读取失败：" + e.getMessage());
                }
            }
        } catch (IOException e) {
            System.err.println("网络连接异常：" + e.getMessage());
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                System.err.println("关闭socket异常：" + e.getMessage());
            }
        }
    }

    private void sendMetadata(DataOutputStream dos, File file) throws IOException {
        dos.writeUTF(file.getName());

        //  dos.writeUTF(getFileExtension(file.getName()));
        dos.writeLong(file.length());
        dos.flush();

        System.out.println("发送文件信息：");
        System.out.println("├─ 文件名：" + file.getName());
        System.out.println("├─ 文件类型：" + getFileExtension(file.getName()));
        System.out.println("└─ 文件大小：" + file.length() + " bytes");
    }

    private void printHelp() {
        System.out.println("\n可用命令：");
        System.out.println("  /send \"文件路径\"  发送指定文件（路径包含空格需用双引号包裹）");
        System.out.println("  /exit            退出发送模式");
        System.out.println("  /help            显示帮助信息");
    }

    private String getFileExtension(String fileName) {
        int dotIndex = fileName.lastIndexOf('.');
        return (dotIndex == -1) ? "unknown" : fileName.substring(dotIndex + 1);
    }
}
